package com.yixin.token.service;

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import net.sourceforge.tess4j.util.ImageHelper;
import org.springframework.stereotype.Service;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

@Service
public class OcrService {

    public String recognizeText(File imageFile) throws TesseractException, IOException {
        Tesseract tesseract = new Tesseract();

        // 设定训练文件的位置（如果是标准英文识别，此步可省略）
        tesseract.setDatapath("E:\\ocr\\tessdata-main");
        tesseract.setLanguage("chi_sim");
        tesseract.setOcrEngineMode(1); // 设置OCR引擎模式（OEM）
        tesseract.setPageSegMode(6);   // 设置图片分割模式（PSM）
        BufferedImage img = ImageIO.read(imageFile);
        // 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分
//        img = ImageHelper.convertImageToGrayscale(img);
// 图片锐化,自己使用中影响识别率的主要因素是针式打印机字迹不连贯,所以锐化反而降低识别率
//        img = ImageHelper.convertImageToBinary(img);
        // 图片放大5倍,增强识别率(很多图片本身无法识别,放大7倍时就可以轻易识,但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大7倍)
//        img = ImageHelper.getScaledInstance(img, img.getWidth() * 7, img.getHeight() * 7);

        return tesseract.doOCR(img);
    }

    public String recognizeTextFromUrl(String imageUrl) throws Exception {
        URL url = new URL(imageUrl);
        InputStream in = url.openStream();
        Files.copy(in, Paths.get("downloaded.jpg"), StandardCopyOption.REPLACE_EXISTING);

        File imageFile = new File("downloaded.jpg");
        return recognizeText(imageFile);
    }
}
